package main

import "fmt"

func main() {
	fmt.Println(head)
	head = nil
	// 遍历链表
	traverse(head)
	addNode(head, 1)
	addNode(head, -1)
	//
	traverse(head)
	addNode(head, 10)
	addNode(head, 5)
	addNode(head, 45)
	//
	addNode(head, 5)
	//
	traverse(head)
	// 查找已存在节点
	if lookupNode(head, 5) {
		fmt.Println("该节点已存在!")
	} else {
		fmt.Println("该节点不存在!")
	}

	// 查找不存在节点
	if lookupNode(head, -100) {
		fmt.Println("该节点已存在!")
	} else {
		fmt.Println("该节点不存在!")
	}
}

type Node struct {
	Value int
	Next  *Node
}

var head = new(Node)

func addNode(t *Node, v int) int {
	if head == nil {
		t = &Node{v, nil}
		head = t
		return 0
	}

	if v == t.Value {
		fmt.Printf("节点已存在: %d\n", v)
		return -1
	}

	//
	if t.Next == nil {
		t.Next = &Node{v, nil}
		return -2
	}

	return addNode(t.Next, v)
}

func traverse(t *Node) {
	if t == nil {
		fmt.Printf("->空链表！\n")
		return
	}
	for t != nil {
		fmt.Printf("%d-> ", t.Value)
		t = t.Next
	}
	fmt.Println()
}

// 泛型
func lookupNode(t *Node, v int) bool {
	if head == nil {
		t = &Node{v, nil}
		head = t
		return false
	}
	if v == t.Value {
		return true
	}
	if t.Next == nil {
		return false
	}
	return lookupNode(t.Next, v)

}

func size(t *Node) int {
	if t == nil {
		fmt.Println("->空链表")
		return 0
	}
	i := 0
	for t != nil {
		i++
		t = t.Next
	}
	return i
}
